{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "tags": [
     "pdf-title"
    ]
   },
   "source": [
    "# Convolutional Networks\n",
    "So far we have worked with deep fully-connected networks, using them to explore different optimization strategies and network architectures. Fully-connected networks are a good testbed for experimentation because they are very computationally efficient, but in practice all state-of-the-art results use convolutional networks instead.\n",
    "\n",
    "First you will implement several layer types that are used in convolutional networks. You will then use these layers to train a convolutional network on the CIFAR-10 dataset."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "tags": [
     "pdf-ignore"
    ]
   },
   "outputs": [],
   "source": [
    "# As usual, a bit of setup\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from cs231n.classifiers.cnn import *\n",
    "from cs231n.data_utils import get_CIFAR10_data\n",
    "from cs231n.gradient_check import eval_numerical_gradient_array, eval_numerical_gradient\n",
    "from cs231n.layers import *\n",
    "from cs231n.fast_layers import *\n",
    "from cs231n.solver import Solver\n",
    "\n",
    "%matplotlib inline\n",
    "plt.rcParams['figure.figsize'] = (10.0, 8.0) # set default size of plots\n",
    "plt.rcParams['image.interpolation'] = 'nearest'\n",
    "plt.rcParams['image.cmap'] = 'gray'\n",
    "\n",
    "# for auto-reloading external modules\n",
    "# see http://stackoverflow.com/questions/1907993/autoreload-of-modules-in-ipython\n",
    "%load_ext autoreload\n",
    "%autoreload 2\n",
    "\n",
    "def rel_error(x, y):\n",
    "  \"\"\" returns relative error \"\"\"\n",
    "  return np.max(np.abs(x - y) / (np.maximum(1e-8, np.abs(x) + np.abs(y))))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "tags": [
     "pdf-ignore"
    ]
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "X_train:  (49000, 3, 32, 32)\n",
      "y_train:  (49000,)\n",
      "X_val:  (1000, 3, 32, 32)\n",
      "y_val:  (1000,)\n",
      "X_test:  (1000, 3, 32, 32)\n",
      "y_test:  (1000,)\n"
     ]
    }
   ],
   "source": [
    "# Load the (preprocessed) CIFAR10 data.\n",
    "\n",
    "data = get_CIFAR10_data()\n",
    "for k, v in data.items():\n",
    "  print('%s: ' % k, v.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Convolution: Naive forward pass\n",
    "The core of a convolutional network is the convolution operation. In the file `cs231n/layers.py`, implement the forward pass for the convolution layer in the function `conv_forward_naive`. \n",
    "\n",
    "You don't have to worry too much about efficiency at this point; just write the code in whatever way you find most clear.\n",
    "\n",
    "You can test your implementation by running the following:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Testing conv_forward_naive\n",
      "difference:  2.2121476417505994e-08\n"
     ]
    }
   ],
   "source": [
    "x_shape = (2, 3, 4, 4)\n",
    "w_shape = (3, 3, 4, 4)\n",
    "x = np.linspace(-0.1, 0.5, num=np.prod(x_shape)).reshape(x_shape)\n",
    "w = np.linspace(-0.2, 0.3, num=np.prod(w_shape)).reshape(w_shape)\n",
    "b = np.linspace(-0.1, 0.2, num=3)\n",
    "\n",
    "conv_param = {'stride': 2, 'pad': 1}\n",
    "out, _ = conv_forward_naive(x, w, b, conv_param)\n",
    "correct_out = np.array([[[[-0.08759809, -0.10987781],\n",
    "                           [-0.18387192, -0.2109216 ]],\n",
    "                          [[ 0.21027089,  0.21661097],\n",
    "                           [ 0.22847626,  0.23004637]],\n",
    "                          [[ 0.50813986,  0.54309974],\n",
    "                           [ 0.64082444,  0.67101435]]],\n",
    "                         [[[-0.98053589, -1.03143541],\n",
    "                           [-1.19128892, -1.24695841]],\n",
    "                          [[ 0.69108355,  0.66880383],\n",
    "                           [ 0.59480972,  0.56776003]],\n",
    "                          [[ 2.36270298,  2.36904306],\n",
    "                           [ 2.38090835,  2.38247847]]]])\n",
    "\n",
    "# Compare your output to ours; difference should be around e-8\n",
    "print('Testing conv_forward_naive')\n",
    "print('difference: ', rel_error(out, correct_out))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Aside: Image processing via convolutions\n",
    "\n",
    "As fun way to both check your implementation and gain a better understanding of the type of operation that convolutional layers can perform, we will set up an input containing two images and manually set up filters that perform common image processing operations (grayscale conversion and edge detection). The convolution forward pass will apply these operations to each of the input images. We can then visualize the results as a sanity check."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "tags": [
     "pdf-ignore-input"
    ]
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 6 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "from imageio import imread\n",
    "from PIL import Image\n",
    "\n",
    "kitten = imread('notebook_images/kitten.jpg')\n",
    "puppy = imread('notebook_images/puppy.jpg')\n",
    "# kitten is wide, and puppy is already square\n",
    "d = kitten.shape[1] - kitten.shape[0]\n",
    "kitten_cropped = kitten[:, d//2:-d//2, :]\n",
    "\n",
    "img_size = 200   # Make this smaller if it runs too slow\n",
    "resized_puppy = np.array(Image.fromarray(puppy).resize((img_size, img_size)))\n",
    "resized_kitten = np.array(Image.fromarray(kitten_cropped).resize((img_size, img_size)))\n",
    "x = np.zeros((2, 3, img_size, img_size))\n",
    "x[0, :, :, :] = resized_puppy.transpose((2, 0, 1))\n",
    "x[1, :, :, :] = resized_kitten.transpose((2, 0, 1))\n",
    "\n",
    "# Set up a convolutional weights holding 2 filters, each 3x3\n",
    "w = np.zeros((2, 3, 3, 3))\n",
    "\n",
    "# The first filter converts the image to grayscale.\n",
    "# Set up the red, green, and blue channels of the filter.\n",
    "w[0, 0, :, :] = [[0, 0, 0], [0, 0.3, 0], [0, 0, 0]]\n",
    "w[0, 1, :, :] = [[0, 0, 0], [0, 0.6, 0], [0, 0, 0]]\n",
    "w[0, 2, :, :] = [[0, 0, 0], [0, 0.1, 0], [0, 0, 0]]\n",
    "\n",
    "# Second filter detects horizontal edges in the blue channel.\n",
    "w[1, 2, :, :] = [[1, 2, 1], [0, 0, 0], [-1, -2, -1]]\n",
    "\n",
    "# Vector of biases. We don't need any bias for the grayscale\n",
    "# filter, but for the edge detection filter we want to add 128\n",
    "# to each output so that nothing is negative.\n",
    "b = np.array([0, 128])\n",
    "\n",
    "# Compute the result of convolving each input in x with each filter in w,\n",
    "# offsetting by b, and storing the results in out.\n",
    "out, _ = conv_forward_naive(x, w, b, {'stride': 1, 'pad': 1})\n",
    "\n",
    "def imshow_no_ax(img, normalize=True):\n",
    "    \"\"\" Tiny helper to show images as uint8 and remove axis labels \"\"\"\n",
    "    if normalize:\n",
    "        img_max, img_min = np.max(img), np.min(img)\n",
    "        img = 255.0 * (img - img_min) / (img_max - img_min)\n",
    "    plt.imshow(img.astype('uint8'))\n",
    "    plt.gca().axis('off')\n",
    "\n",
    "# Show the original images and the results of the conv operation\n",
    "plt.subplot(2, 3, 1)\n",
    "imshow_no_ax(puppy, normalize=False)\n",
    "plt.title('Original image')\n",
    "plt.subplot(2, 3, 2)\n",
    "imshow_no_ax(out[0, 0])\n",
    "plt.title('Grayscale')\n",
    "plt.subplot(2, 3, 3)\n",
    "imshow_no_ax(out[0, 1])\n",
    "plt.title('Edges')\n",
    "plt.subplot(2, 3, 4)\n",
    "imshow_no_ax(kitten_cropped, normalize=False)\n",
    "plt.subplot(2, 3, 5)\n",
    "imshow_no_ax(out[1, 0])\n",
    "plt.subplot(2, 3, 6)\n",
    "imshow_no_ax(out[1, 1])\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Convolution: Naive backward pass\n",
    "Implement the backward pass for the convolution operation in the function `conv_backward_naive` in the file `cs231n/layers.py`. Again, you don't need to worry too much about computational efficiency.\n",
    "\n",
    "When you are done, run the following to check your backward pass with a numeric gradient check."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Testing conv_backward_naive function\n",
      "dx error:  1.159803161159293e-08\n",
      "dw error:  2.247109434939654e-10\n",
      "db error:  3.37264006649648e-11\n"
     ]
    }
   ],
   "source": [
    "np.random.seed(231)\n",
    "x = np.random.randn(4, 3, 5, 5)\n",
    "w = np.random.randn(2, 3, 3, 3)\n",
    "b = np.random.randn(2,)\n",
    "dout = np.random.randn(4, 2, 5, 5)\n",
    "conv_param = {'stride': 1, 'pad': 1}\n",
    "\n",
    "dx_num = eval_numerical_gradient_array(lambda x: conv_forward_naive(x, w, b, conv_param)[0], x, dout)\n",
    "dw_num = eval_numerical_gradient_array(lambda w: conv_forward_naive(x, w, b, conv_param)[0], w, dout)\n",
    "db_num = eval_numerical_gradient_array(lambda b: conv_forward_naive(x, w, b, conv_param)[0], b, dout)\n",
    "\n",
    "out, cache = conv_forward_naive(x, w, b, conv_param)\n",
    "dx, dw, db = conv_backward_naive(dout, cache)\n",
    "\n",
    "# Your errors should be around e-8 or less.\n",
    "print('Testing conv_backward_naive function')\n",
    "print('dx error: ', rel_error(dx, dx_num))\n",
    "print('dw error: ', rel_error(dw, dw_num))\n",
    "print('db error: ', rel_error(db, db_num))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Max-Pooling: Naive forward\n",
    "Implement the forward pass for the max-pooling operation in the function `max_pool_forward_naive` in the file `cs231n/layers.py`. Again, don't worry too much about computational efficiency.\n",
    "\n",
    "Check your implementation by running the following:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Testing max_pool_forward_naive function:\n",
      "difference:  4.1666665157267834e-08\n"
     ]
    }
   ],
   "source": [
    "x_shape = (2, 3, 4, 4)\n",
    "x = np.linspace(-0.3, 0.4, num=np.prod(x_shape)).reshape(x_shape)\n",
    "pool_param = {'pool_width': 2, 'pool_height': 2, 'stride': 2}\n",
    "\n",
    "out, _ = max_pool_forward_naive(x, pool_param)\n",
    "\n",
    "correct_out = np.array([[[[-0.26315789, -0.24842105],\n",
    "                          [-0.20421053, -0.18947368]],\n",
    "                         [[-0.14526316, -0.13052632],\n",
    "                          [-0.08631579, -0.07157895]],\n",
    "                         [[-0.02736842, -0.01263158],\n",
    "                          [ 0.03157895,  0.04631579]]],\n",
    "                        [[[ 0.09052632,  0.10526316],\n",
    "                          [ 0.14947368,  0.16421053]],\n",
    "                         [[ 0.20842105,  0.22315789],\n",
    "                          [ 0.26736842,  0.28210526]],\n",
    "                         [[ 0.32631579,  0.34105263],\n",
    "                          [ 0.38526316,  0.4       ]]]])\n",
    "\n",
    "# Compare your output with ours. Difference should be on the order of e-8.\n",
    "print('Testing max_pool_forward_naive function:')\n",
    "print('difference: ', rel_error(out, correct_out))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Max-Pooling: Naive backward\n",
    "Implement the backward pass for the max-pooling operation in the function `max_pool_backward_naive` in the file `cs231n/layers.py`. You don't need to worry about computational efficiency.\n",
    "\n",
    "Check your implementation with numeric gradient checking by running the following:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Testing max_pool_backward_naive function:\n",
      "dx error:  3.27562514223145e-12\n"
     ]
    }
   ],
   "source": [
    "np.random.seed(231)\n",
    "x = np.random.randn(3, 2, 8, 8)\n",
    "dout = np.random.randn(3, 2, 4, 4)\n",
    "pool_param = {'pool_height': 2, 'pool_width': 2, 'stride': 2}\n",
    "\n",
    "dx_num = eval_numerical_gradient_array(lambda x: max_pool_forward_naive(x, pool_param)[0], x, dout)\n",
    "\n",
    "out, cache = max_pool_forward_naive(x, pool_param)\n",
    "dx = max_pool_backward_naive(dout, cache)\n",
    "\n",
    "# Your error should be on the order of e-12\n",
    "print('Testing max_pool_backward_naive function:')\n",
    "print('dx error: ', rel_error(dx, dx_num))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Fast layers\n",
    "Making convolution and pooling layers fast can be challenging. To spare you the pain, we've provided fast implementations of the forward and backward passes for convolution and pooling layers in the file `cs231n/fast_layers.py`.\n",
    "\n",
    "The fast convolution implementation depends on a Cython extension; to compile it you need to run the following from the `cs231n` directory:\n",
    "\n",
    "```bash\n",
    "python setup.py build_ext --inplace\n",
    "```\n",
    "\n",
    "The API for the fast versions of the convolution and pooling layers is exactly the same as the naive versions that you implemented above: the forward pass receives data, weights, and parameters and produces outputs and a cache object; the backward pass recieves upstream derivatives and the cache object and produces gradients with respect to the data and weights.\n",
    "\n",
    "**NOTE:** The fast implementation for pooling will only perform optimally if the pooling regions are non-overlapping and tile the input. If these conditions are not met then the fast pooling implementation will not be much faster than the naive implementation.\n",
    "\n",
    "You can compare the performance of the naive and fast versions of these layers by running the following:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Testing conv_forward_fast:\n",
      "Naive: 0.150599s\n",
      "Fast: 0.010966s\n",
      "Speedup: 13.733807x\n",
      "Difference:  4.926407851494105e-11\n",
      "\n",
      "Testing conv_backward_fast:\n",
      "Naive: 0.335133s\n",
      "Fast: 0.010941s\n",
      "Speedup: 30.632213x\n",
      "dx difference:  1.949764775345631e-11\n",
      "dw difference:  8.92268342061343e-14\n",
      "db difference:  0.0\n"
     ]
    }
   ],
   "source": [
    "# Rel errors should be around e-9 or less\n",
    "from cs231n.fast_layers import conv_forward_fast, conv_backward_fast\n",
    "from time import time\n",
    "np.random.seed(231)\n",
    "x = np.random.randn(100, 3, 31, 31)\n",
    "w = np.random.randn(25, 3, 3, 3)\n",
    "b = np.random.randn(25,)\n",
    "dout = np.random.randn(100, 25, 16, 16)\n",
    "conv_param = {'stride': 2, 'pad': 1}\n",
    "\n",
    "t0 = time()\n",
    "out_naive, cache_naive = conv_forward_naive(x, w, b, conv_param)\n",
    "t1 = time()\n",
    "out_fast, cache_fast = conv_forward_fast(x, w, b, conv_param)\n",
    "t2 = time()\n",
    "\n",
    "print('Testing conv_forward_fast:')\n",
    "print('Naive: %fs' % (t1 - t0))\n",
    "print('Fast: %fs' % (t2 - t1))\n",
    "print('Speedup: %fx' % ((t1 - t0) / (t2 - t1)))\n",
    "print('Difference: ', rel_error(out_naive, out_fast))\n",
    "\n",
    "t0 = time()\n",
    "dx_naive, dw_naive, db_naive = conv_backward_naive(dout, cache_naive)\n",
    "t1 = time()\n",
    "dx_fast, dw_fast, db_fast = conv_backward_fast(dout, cache_fast)\n",
    "t2 = time()\n",
    "\n",
    "print('\\nTesting conv_backward_fast:')\n",
    "print('Naive: %fs' % (t1 - t0))\n",
    "print('Fast: %fs' % (t2 - t1))\n",
    "print('Speedup: %fx' % ((t1 - t0) / (t2 - t1)))\n",
    "print('dx difference: ', rel_error(dx_naive, dx_fast))\n",
    "print('dw difference: ', rel_error(dw_naive, dw_fast))\n",
    "print('db difference: ', rel_error(db_naive, db_fast))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Testing pool_forward_fast:\n",
      "Naive: 0.007003s\n",
      "fast: 0.002971s\n",
      "speedup: 2.357303x\n",
      "difference:  0.0\n",
      "\n",
      "Testing pool_backward_fast:\n",
      "Naive: 0.817923s\n",
      "fast: 0.010951s\n",
      "speedup: 74.687414x\n",
      "dx difference:  0.0\n"
     ]
    }
   ],
   "source": [
    "# Relative errors should be close to 0.0\n",
    "from cs231n.fast_layers import max_pool_forward_fast, max_pool_backward_fast\n",
    "np.random.seed(231)\n",
    "x = np.random.randn(100, 3, 32, 32)\n",
    "dout = np.random.randn(100, 3, 16, 16)\n",
    "pool_param = {'pool_height': 2, 'pool_width': 2, 'stride': 2}\n",
    "\n",
    "t0 = time()\n",
    "out_naive, cache_naive = max_pool_forward_naive(x, pool_param)\n",
    "t1 = time()\n",
    "out_fast, cache_fast = max_pool_forward_fast(x, pool_param)\n",
    "t2 = time()\n",
    "\n",
    "print('Testing pool_forward_fast:')\n",
    "print('Naive: %fs' % (t1 - t0))\n",
    "print('fast: %fs' % (t2 - t1))\n",
    "print('speedup: %fx' % ((t1 - t0) / (t2 - t1)))\n",
    "print('difference: ', rel_error(out_naive, out_fast))\n",
    "\n",
    "t0 = time()\n",
    "dx_naive = max_pool_backward_naive(dout, cache_naive)\n",
    "t1 = time()\n",
    "dx_fast = max_pool_backward_fast(dout, cache_fast)\n",
    "t2 = time()\n",
    "\n",
    "print('\\nTesting pool_backward_fast:')\n",
    "print('Naive: %fs' % (t1 - t0))\n",
    "print('fast: %fs' % (t2 - t1))\n",
    "print('speedup: %fx' % ((t1 - t0) / (t2 - t1)))\n",
    "print('dx difference: ', rel_error(dx_naive, dx_fast))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Convolutional \"sandwich\" layers\n",
    "Previously we introduced the concept of \"sandwich\" layers that combine multiple operations into commonly used patterns. In the file `cs231n/layer_utils.py` you will find sandwich layers that implement a few commonly used patterns for convolutional networks. Run the cells below to sanity check they're working."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Testing conv_relu_pool\n",
      "dx error:  9.591132621921372e-09\n",
      "dw error:  5.802401370096438e-09\n",
      "db error:  1.0146343411762047e-09\n"
     ]
    }
   ],
   "source": [
    "from cs231n.layer_utils import conv_relu_pool_forward, conv_relu_pool_backward\n",
    "np.random.seed(231)\n",
    "x = np.random.randn(2, 3, 16, 16)\n",
    "w = np.random.randn(3, 3, 3, 3)\n",
    "b = np.random.randn(3,)\n",
    "dout = np.random.randn(2, 3, 8, 8)\n",
    "conv_param = {'stride': 1, 'pad': 1}\n",
    "pool_param = {'pool_height': 2, 'pool_width': 2, 'stride': 2}\n",
    "\n",
    "out, cache = conv_relu_pool_forward(x, w, b, conv_param, pool_param)\n",
    "dx, dw, db = conv_relu_pool_backward(dout, cache)\n",
    "\n",
    "dx_num = eval_numerical_gradient_array(lambda x: conv_relu_pool_forward(x, w, b, conv_param, pool_param)[0], x, dout)\n",
    "dw_num = eval_numerical_gradient_array(lambda w: conv_relu_pool_forward(x, w, b, conv_param, pool_param)[0], w, dout)\n",
    "db_num = eval_numerical_gradient_array(lambda b: conv_relu_pool_forward(x, w, b, conv_param, pool_param)[0], b, dout)\n",
    "\n",
    "# Relative errors should be around e-8 or less\n",
    "print('Testing conv_relu_pool')\n",
    "print('dx error: ', rel_error(dx_num, dx))\n",
    "print('dw error: ', rel_error(dw_num, dw))\n",
    "print('db error: ', rel_error(db_num, db))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Testing conv_relu:\n",
      "dx error:  1.5218619980349303e-09\n",
      "dw error:  2.702022646099404e-10\n",
      "db error:  1.451272393591721e-10\n"
     ]
    }
   ],
   "source": [
    "from cs231n.layer_utils import conv_relu_forward, conv_relu_backward\n",
    "np.random.seed(231)\n",
    "x = np.random.randn(2, 3, 8, 8)\n",
    "w = np.random.randn(3, 3, 3, 3)\n",
    "b = np.random.randn(3,)\n",
    "dout = np.random.randn(2, 3, 8, 8)\n",
    "conv_param = {'stride': 1, 'pad': 1}\n",
    "\n",
    "out, cache = conv_relu_forward(x, w, b, conv_param)\n",
    "dx, dw, db = conv_relu_backward(dout, cache)\n",
    "\n",
    "dx_num = eval_numerical_gradient_array(lambda x: conv_relu_forward(x, w, b, conv_param)[0], x, dout)\n",
    "dw_num = eval_numerical_gradient_array(lambda w: conv_relu_forward(x, w, b, conv_param)[0], w, dout)\n",
    "db_num = eval_numerical_gradient_array(lambda b: conv_relu_forward(x, w, b, conv_param)[0], b, dout)\n",
    "\n",
    "# Relative errors should be around e-8 or less\n",
    "print('Testing conv_relu:')\n",
    "print('dx error: ', rel_error(dx_num, dx))\n",
    "print('dw error: ', rel_error(dw_num, dw))\n",
    "print('db error: ', rel_error(db_num, db))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Three-layer ConvNet\n",
    "Now that you have implemented all the necessary layers, we can put them together into a simple convolutional network.\n",
    "\n",
    "Open the file `cs231n/classifiers/cnn.py` and complete the implementation of the `ThreeLayerConvNet` class. Remember you can use the fast/sandwich layers (already imported for you) in your implementation. Run the following cells to help you debug:"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Sanity check loss\n",
    "After you build a new network, one of the first things you should do is sanity check the loss. When we use the softmax loss, we expect the loss for random weights (and no regularization) to be about `log(C)` for `C` classes. When we add regularization the loss should go up slightly."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Initial loss (no regularization):  2.302586071243987\n",
      "Initial loss (with regularization):  2.713925200099603\n"
     ]
    }
   ],
   "source": [
    "model = ThreeLayerConvNet()\n",
    "\n",
    "N = 50\n",
    "X = np.random.randn(N, 3, 32, 32)\n",
    "y = np.random.randint(10, size=N)\n",
    "\n",
    "loss, grads = model.loss(X, y)\n",
    "print('Initial loss (no regularization): ', loss)\n",
    "\n",
    "model.reg = 0.5\n",
    "loss, grads = model.loss(X, y)\n",
    "print('Initial loss (with regularization): ', loss)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Gradient check\n",
    "After the loss looks reasonable, use numeric gradient checking to make sure that your backward pass is correct. When you use numeric gradient checking you should use a small amount of artifical data and a small number of neurons at each layer. Note: correct implementations may still have relative errors up to the order of e-2."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "W1 max relative error: 1.380104e-04\n",
      "W2 max relative error: 1.822723e-02\n",
      "W3 max relative error: 3.064049e-04\n",
      "b1 max relative error: 3.477652e-05\n",
      "b2 max relative error: 2.516375e-03\n",
      "b3 max relative error: 7.945660e-10\n"
     ]
    }
   ],
   "source": [
    "num_inputs = 2\n",
    "input_dim = (3, 16, 16)\n",
    "reg = 0.0\n",
    "num_classes = 10\n",
    "np.random.seed(231)\n",
    "X = np.random.randn(num_inputs, *input_dim)\n",
    "y = np.random.randint(num_classes, size=num_inputs)\n",
    "\n",
    "model = ThreeLayerConvNet(num_filters=3, filter_size=3,\n",
    "                          input_dim=input_dim, hidden_dim=7,\n",
    "                          dtype=np.float64)\n",
    "loss, grads = model.loss(X, y)\n",
    "# Errors should be small, but correct implementations may have\n",
    "# relative errors up to the order of e-2\n",
    "for param_name in sorted(grads):\n",
    "    f = lambda _: model.loss(X, y)[0]\n",
    "    param_grad_num = eval_numerical_gradient(f, model.params[param_name], verbose=False, h=1e-6)\n",
    "    e = rel_error(param_grad_num, grads[param_name])\n",
    "    print('%s max relative error: %e' % (param_name, rel_error(param_grad_num, grads[param_name])))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Overfit small data\n",
    "A nice trick is to train your model with just a few training samples. You should be able to overfit small datasets, which will result in very high training accuracy and comparatively low validation accuracy."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(Iteration 1 / 30) loss: 2.414060\n",
      "(Epoch 0 / 15) train acc: 0.200000; val_acc: 0.137000\n",
      "(Iteration 2 / 30) loss: 3.102925\n",
      "(Epoch 1 / 15) train acc: 0.140000; val_acc: 0.087000\n",
      "(Iteration 3 / 30) loss: 2.270330\n",
      "(Iteration 4 / 30) loss: 2.096705\n",
      "(Epoch 2 / 15) train acc: 0.240000; val_acc: 0.094000\n",
      "(Iteration 5 / 30) loss: 1.838880\n",
      "(Iteration 6 / 30) loss: 1.934188\n",
      "(Epoch 3 / 15) train acc: 0.510000; val_acc: 0.173000\n",
      "(Iteration 7 / 30) loss: 1.827912\n",
      "(Iteration 8 / 30) loss: 1.639574\n",
      "(Epoch 4 / 15) train acc: 0.520000; val_acc: 0.188000\n",
      "(Iteration 9 / 30) loss: 1.330082\n",
      "(Iteration 10 / 30) loss: 1.756115\n",
      "(Epoch 5 / 15) train acc: 0.630000; val_acc: 0.167000\n",
      "(Iteration 11 / 30) loss: 1.024162\n",
      "(Iteration 12 / 30) loss: 1.041826\n",
      "(Epoch 6 / 15) train acc: 0.750000; val_acc: 0.229000\n",
      "(Iteration 13 / 30) loss: 1.142777\n",
      "(Iteration 14 / 30) loss: 0.835706\n",
      "(Epoch 7 / 15) train acc: 0.790000; val_acc: 0.247000\n",
      "(Iteration 15 / 30) loss: 0.587786\n",
      "(Iteration 16 / 30) loss: 0.645509\n",
      "(Epoch 8 / 15) train acc: 0.820000; val_acc: 0.252000\n",
      "(Iteration 17 / 30) loss: 0.786844\n",
      "(Iteration 18 / 30) loss: 0.467054\n",
      "(Epoch 9 / 15) train acc: 0.820000; val_acc: 0.178000\n",
      "(Iteration 19 / 30) loss: 0.429880\n",
      "(Iteration 20 / 30) loss: 0.635498\n",
      "(Epoch 10 / 15) train acc: 0.900000; val_acc: 0.206000\n",
      "(Iteration 21 / 30) loss: 0.365807\n",
      "(Iteration 22 / 30) loss: 0.284220\n",
      "(Epoch 11 / 15) train acc: 0.820000; val_acc: 0.201000\n",
      "(Iteration 23 / 30) loss: 0.469343\n",
      "(Iteration 24 / 30) loss: 0.509369\n",
      "(Epoch 12 / 15) train acc: 0.920000; val_acc: 0.211000\n",
      "(Iteration 25 / 30) loss: 0.111638\n",
      "(Iteration 26 / 30) loss: 0.145388\n",
      "(Epoch 13 / 15) train acc: 0.930000; val_acc: 0.213000\n",
      "(Iteration 27 / 30) loss: 0.155575\n",
      "(Iteration 28 / 30) loss: 0.143398\n",
      "(Epoch 14 / 15) train acc: 0.960000; val_acc: 0.212000\n",
      "(Iteration 29 / 30) loss: 0.158160\n",
      "(Iteration 30 / 30) loss: 0.118934\n",
      "(Epoch 15 / 15) train acc: 0.990000; val_acc: 0.220000\n"
     ]
    }
   ],
   "source": [
    "np.random.seed(231)\n",
    "\n",
    "num_train = 100\n",
    "small_data = {\n",
    "  'X_train': data['X_train'][:num_train],\n",
    "  'y_train': data['y_train'][:num_train],\n",
    "  'X_val': data['X_val'],\n",
    "  'y_val': data['y_val'],\n",
    "}\n",
    "\n",
    "model = ThreeLayerConvNet(weight_scale=1e-2)\n",
    "\n",
    "solver = Solver(model, small_data,\n",
    "                num_epochs=15, batch_size=50,\n",
    "                update_rule='adam',\n",
    "                optim_config={\n",
    "                  'learning_rate': 1e-3,\n",
    "                },\n",
    "                verbose=True, print_every=1)\n",
    "solver.train()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Plotting the loss, training accuracy, and validation accuracy should show clear overfitting:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYoAAAEGCAYAAAB7DNKzAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAAgAElEQVR4nO3deXxU9bn48c9D9gUI+xKWgFIWEUEDYrEtihbQutStuHW7LW3Var0tFdpfW9rbXrmlt622tmqtVVs3qoBaraCCcq1a2XdQBIQkYAISSEJCtuf3xzmBLDOTmWRmzizP+/XKa2bOnDnzHIY5z5zv8hxRVYwxxhh/ungdgDHGmNhmicIYY0xAliiMMcYEZInCGGNMQJYojDHGBJTqdQDh1Lt3by0oKPA6DGOMiRtr1649pKp9Aq2TUImioKCANWvWeB2GMcbEDRH5sL11EipRRNLS9cUsXLaTkvJqBuZlMWf6SK6ckO91WMYYE3GWKIKwdH0x8xZvprquAYDi8mrmLd4MYMnCGJPwrDM7CAuX7TyZJJpU1zWwcNlOjyIyxpjoidlEISKZIvKuiGwUka0i8lOvYikprw5puTHGJJKYTRTACeBCVT0LGA/MEJHJXgQyMC8rpOXGGJNIYjZRqKPSfZjm/nlSwXDO9JFkpaW0WJaVlsKc6SO9CMcYY6IqZhMFgIikiMgGoBR4RVX/7WOd2SKyRkTWlJWVRSSOKyfkc/dVZ5Kfl4UA+XlZ3H3VmdaRbYxJChIPZcZFJA9YAnxbVbf4W6+wsFBtHoUxxgRPRNaqamGgdWL6jKKJqpYDrwMzPA7FGGOSTswmChHp455JICJZwEXADm+jMsaY5BPLE+4GAI+KSApOQlukqv/wOCZjjEk6MZsoVHUTMMHrOIwxJtnFbNOTMcaY2GCJwhhjTECWKIwxxgRkicIYY0xAliiMMcYEZInCGGNMQJYojDHGBGSJwhhjTECWKIwxxgQUszOzo2Xp+mIWLttJSXk1A/OymDN9pJUPN8aYZpI6USxdX8y8xZtPXg+7uLyaeYs3A1iyMMYYV1I3PS1ctvNkkmhSXdfAwmU7PYrIGGNiT1InipLy6pCWG2NMMkrqpqeBeVkU+0gKA/OyOrVd6/cwxiSSpD6jmDN9JFlpKS2WZaWlMGf6yA5vs6nfo7i8GuVUv8fS9cWdjNYYY7yR1Iniygn53H3VmeTnZSFAfl4Wd191Zqd+/Vu/hzEm0SR10xM4ySKczULW72GMSTRJfUYRCf76Nzrb72GMMV6xRBFmofR7LF1fzJQFKxg290WmLFhh/RjGmJiU9E1P4dbUjNXeqCeb7GeMiReWKCIgmH6PQJ3eliiMMbEkZpueRGSwiKwUke0islVE7vA6pnCyTm9jTLyI2UQB1APfVdXRwGTgVhEZ43FMYWOd3saYeBGziUJVD6jqOvd+BbAdSJg2mUhM9gPrIDfGhF9c9FGISAEwAfi3j+dmA7MBhgwZEtW4OiPYTu9QWAe5MSYSRFW9jiEgEckF3gB+oaqLA61bWFioa9asiU5gMWjKghU+a1fl52Xxr7kXehCRMSbWichaVS0MtE5Mn1GISBrwLPB4e0ki0QVTaDDUDnIrXmiMCUbMJgoREeDPwHZV/bXX8Xgp2CalUKrhWjOVMSZYMduZDUwBbgYuFJEN7t8lXgflhWALDYbSQe518ULrdDcmfkTljMKdA/EXoAJ4CKdjeq6qLvf3GlV9E5BoxBfrgm1SCqWD3Mt5HHY2Y0x8iVbT01dV9R4RmQ70Ab6Ckzj8JgpzSihNSsFWw43URZuCYbPSjYkv0Wp6ajozuAT4i6puxM4WghaJOReRmscRDJuVbkx8idYZxVoRWQ4MA+aJSFegMUrvHfciMecilG2Ge3SUl2czxpjQRWUehYh0AcYDu1W1XER6AoNUdVM43yfZ51FEQuv+BHDOPDpzJcBIbNMY0zHBzKOIVtPTecBON0ncBPw/4GiU3tt0QiRGR0XiErTGmMiJVtPTH4GzROQs4Ps48yMeAz4Tpfc3HRSp/oRwX4LWGBM50TqjqFenjesK4B5VvQfoGqX3Np1gVW6NMdFKFBUiMg9nAt2LIpICpEXpvU0neDk6yhgTG6KVKL4AnMCZT3EQp1z4wii9t+kE608wxkSteqyI9AMmug/fVdXScL+HjXoyxpjQxMyoJxG5DngXuBa4Dvi3iFwTjfc2xhjTOdEa9fRDYGLTWYSI9AFeBZ6J0vubKLHS5cYknmglii6tmpoOE9uVa00HWLE/YxJTtA7WL4vIMhH5soh8GXgReClK722ixOvS5caYyIjKGYWqzhGRq3GuMSHAg6q6JBrvbaLHiv0Zk5iidoU7VX0W57KmJkFZsT9jElNEm55EpEJEjvn4qxCRY5F8bxN9NjnPmMQU0TMKVbUyHUkkEuXQI8VGZxkTvKg1PZnkEA/F/mx0ljGhsSGqJunY6CxjQmNnFCbmBdtMFOx6NjrLmNDE7BmFiDwsIqUissXrWIx3mpqJisurUU41Ey1dX9yh9cBKpxsTqphNFMAjwAyvgzDeCraZKJTmJBudZUxoYrbpSVVXiUiB13EYbwXbTBRKc1I8jc4yJhbEbKIIlojMBmYDDBkyxONoTLgFO4kv1Ml+8TA6y5hYEctNT0FR1QdVtVBVC/v06eN1OCbMgm0msuYkYyIn7s8oTGILtpkoUs1JNjHPmChe4a4j3D6Kf6jq2GDWtyvcmXBqPTEPnLOUaF4K1hKVibSYucJdR4jIk8DbwEgRKRKR//A6JpNcvJ6YF8qQX2MiKWabnlT1eq9jMMnN64l5gRKVnVWYaIrZMwpjvOb1xDyvE5UxTSxRGOOH1yOpvE5UxjSJ2aYnY7zm9UiqOdNH+uxMj1aiso5008QShTEBhDIxL5gDayglzr2cQW6l2E1zMT08NlQ2PNZ4JdihtFMWrPA5gzw/L4t/zb0wKrEGI17iNJ0X18NjjYknwQ6ljZcO6niJ00SHNT0ZEwbBHlhDrUnllXiJE6wvJRrsjMKYMAh2hFKkRlItXV/MlAUrGDb3RaYsWNHpSXlej/iC4PbJJiVGhyUKY8Ig2APrlRPyufuqM8nPy0Jw2vw7WxIk1INlMAfgSMQZimD3yevZ88nCmp6MCYNQRiiFu8R5KDO4Qx115VUTTrD7ZH0p0WGJwpgw8erAGsrBMlJlQcLdT5BofT7xzpqejIlzoczgjsQv8Ej0E3jd52NaskRhTJwL5WAZibIgkegn8LLPx7RlTU/GxLlQ+kciURYklLOUYJuovOzzMW1ZojAmAQR7sIxEWZBg+wlCLQtiCSB2WKIwJsmE+wAc7FmKXV8jflmiMMZ0SrBnKYk6lDUSM8Njbba5JQpjTKcFc5YST0NZgz1Qh9Kc5uU2O8tGPRljoiIWhrKGuyxIsCO+vN5mZ1miMMZEhddDWSNRFiTY5jSvt9lZ1vRkjImaRCsLEmxzmtfb7KyYPqMQkRkislNEdonIXK/jMcbEr1DKgvjia3mwzWleb7OzYjZRiEgKcB8wExgDXC8iY7yNyhgTryJRFiTY5jSvt9lZsdz0NAnYpaq7AUTkKeAKYJunURlj4lKw8z1CnZQYTHNaLGyzM2L2mtkicg0wQ1W/5j6+GThXVW9rtd5sYDbAkCFDzvnwww+jHqsxJj7E2vyEWBDMNbNj+YxCfCxrk9VU9UHgQQARKRORjmaK3sChDr42FiXa/kDi7VOi7Q/E0T7tBT4/r93V4mZ/QtB6n4a294JYThRFwOBmjwcBJYFeoKp9OvpmIrKmvawaTxJtfyDx9inR9gcSb58SbX+gY/sUs53ZwGpghIgME5F0YBbwvMcxGWNM0onZMwpVrReR24BlQArwsKpu9TgsY4xJOjGbKABU9SXgpSi93YNRep9oSbT9gcTbp0TbH0i8fUq0/YEO7FPMjnoyxhgTG2K5j8IYY0wMsERhjDEmoKRPFIlYT0pE9orIZhHZICJrvI4nVCLysIiUisiWZst6isgrIvK+e9vDyxhD5Wef5otIsfs5bRCRS7yMMRQiMlhEVorIdhHZKiJ3uMvj9nMKsE9x+TmJSKaIvCsiG939+am7POTPKKn7KNx6Uu8BF+PM21gNXK+qcV0mRET2AoWqGpcThUTk00Al8JiqjnWX/RL4WFUXuAm9h6re5WWcofCzT/OBSlX9lZexdYSIDAAGqOo6EekKrAWuBL5MnH5OAfbpOuLwcxIRAXJUtVJE0oA3gTuAqwjxM0r2M4qT9aRUtRZoqidlPKSqq4CPWy2+AnjUvf8ozhc4bvjZp7ilqgdUdZ17vwLYDuQTx59TgH2KS+qodB+muX9KBz6jZE8U+cD+Zo+LiOP/GM0osFxE1rq1sBJBP1U9AM4XGujrcTzhcpuIbHKbpuKmmaY5ESkAJgD/JkE+p1b7BHH6OYlIiohsAEqBV1S1Q59RsieKoOpJxaEpqno2Ton2W91mDxN7/gicBowHDgD/6204oRORXOBZ4DuqeszreMLBxz7F7eekqg2qOh6nBNIkERnbke0ke6IIuZ5UPFDVEve2FFiC08QW7z5y25Cb2pJLPY6n01T1I/eL3Aj8iTj7nNx272eBx1V1sbs4rj8nX/sU758TgKqWA68DM+jAZ5TsiSLh6kmJSI7bEYeI5ACfBbYEflVceB74knv/S8BzHsYSFk1fVtfniaPPye0o/TOwXVV/3eypuP2c/O1TvH5OItJHRPLc+1nARcAOOvAZJfWoJwB3qNtvOVVP6hceh9QpIjIc5ywCnBItT8TbPonIk8BUnHLIHwE/AZYCi4AhwD7gWlWNm85hP/s0Fac5Q3GqXn+jqe041onI+cD/AZuBRnfxD3Da9OPycwqwT9cTh5+TiIzD6axOwTkpWKSqPxORXoT4GSV9ojDGGBNYsjc9GWOMaYclCmOMMQFZojDGGBNQxK5HISIPA58DSptKFrR6XoB7gEuA48CXm2ZFisgM97kU4CFVXRDMe/bu3VsLCgrCswPGGJME1q5de6i9y0hH8sJFjwC/Bx7z8/xMYIT7dy7OpJZz3fpL99Gs/pKIPB9M/aWCggLWrIm7GnjGGNMhS9cXs3DZTkrKqxmYl8Wc6SO5ckJoxSVE5MP21olYolDVVe40eH+uwCmQpsA7IpLnjlcuwK2/BCAiTfWX4rpQnzHGhNPS9cXMW7yZ6roGAIrLq5m3eDNAyMmiPV72UfirsxRS/SURmS0ia0RkTVlZWUQCNcaYWLNw2c6TSaJJdV0DC5ftDPt7eXnNbH91lkKqv6SqD+JeA7awsNAmhRhjYlZHmoqqaxvYe7iKvYeq2H2oij2HnPvF5dU+1y/xs7wzvEwU/uospftZ3iF1dXUUFRVRU1PT0U3EhczMTAYNGkRaWprXoRhjfAjUVHTpuAHs//g4e9xEsKdZQig52vLY1bdrBsN655CdnsLx2oY27zMwLyvssXuZKJ7HKd37FE5n9lFVPSAiZbj1l4BinPpLN3T0TYqKiujatSsFBQU4A60Sj6py+PBhioqKGDZsmNfhGGN8+OWyHT6bir7794189+8baWg81SDSPSuNYb1zmDy8FwW9cxjm/hX0ziE3wzlst048AFlpKcyZPjLssUdyeOzJ2jYiUoRT2yYNQFXvB17CGRq7C2d47Ffc5+pF5DZgGafqL23taBw1NTUJnSQARIRevXphfTTGhFeoTUWqyqHKWvYermJPmdNUtNc9Oygp992q0dCo3HbB6ScTwvDeOfTISW83tqY4OjvqKRiRHPV0fTvPK3Crn+dewkkkYZHISaJJMuyjMYGEY6ho6+35ayq6YFRf9h6qYu/hKnaXuc1EbnKoOFF/chtpKcKQntkM651LcflxKk+0bSrKz8viex08C7hyQn5EEkNrXjY9GWNMWHR2qKiqcqK+keO1DVSdqKeqtp6fv7jNZ1PRfy7aQLNWIkScg/2w3jlcdXZ+szODXAbmZZKa0sVnjBC5pqJws0TRSrh/lZSXl/PEE09wyy23hPS6Sy65hCeeeIK8vLwOv7cx4RTu70Y4+Rsq+qPntrD9wDEqT9RzvLbBva2n8kQDx0/Uu0nBSQ71jcENmmxUmDdzFAVuM9HgntlkpqW0+7poNhWFmyWKZiIxgaW8vJw//OEPbRJFQ0MDKSn+/3O99FLYWt6M6bRoTu7qCH9DQitq6nnkrb3kZKSSk5FCTnoqORmpdM9KY2D3TGd5eor7fMv7P1q6hcNVtW22mZ+XxTc+c1qH4oxWU1G4JVWi+OkLW9lW4v+yvuv3lVPb0NhiWXVdA99/ZhNPvrvP52vGDOzGTy47w+82586dywcffMD48eNJS0sjNzeXAQMGsGHDBrZt28aVV17J/v37qamp4Y477mD27NnAqXIklZWVzJw5k/PPP5+33nqL/Px8nnvuObKywj8Ezhh/Ak3u8vLAd/BoDQ+s+sDvRKuBeZm8NXdah7ZdW98Yt01F4ZZUiaI9rZNEe8uDsWDBArZs2cKGDRt4/fXXufTSS9myZcvJYawPP/wwPXv2pLq6mokTJ3L11VfTq1evFtt4//33efLJJ/nTn/7Eddddx7PPPstNN93U4ZiMCcWeKE/uCkZxeTX3v/4BT6/eT4Mqkwp6sLHoKCfqT31Xs9JS+P70UR1+j3huKgq3pEoUgX75A0xZsMLnFyI/L4unv3FeWGKYNGlSi7kO9957L0uWOFcu3b9/P++//36bRDFs2DDGjx8PwDnnnMPevXvDEosx/tTUNfDyloM8tXof7+z2f5VMEfjf5Tu5rnAwg3tmRzyu/R8f5w+v7+KZtUUAXHPOIL71mdMZ0is7In0o8dpUFG5JlSjaM2f6yIifaubk5Jy8//rrr/Pqq6/y9ttvk52dzdSpU33OIM/IyDh5PyUlhepqb37FmcS3/cAxnl69nyXrizlaXceQntnMmT6S3IwUFvyzZfNTeopwWp9c7lu5i9+t2MWnRvTmCxMHc/GYfmSktt+5G4o9h6q4b+UulqwvJkWEWROH8M2pp5HfbBayHdQjxxJFM5E41ezatSsVFRU+nzt69Cg9evQgOzubHTt28M4773T4fYzpqMoT9bywsYSnVu9n4/5y0lO6MGNsf2ZNHMzk4b3o0sWZo9M9K93nd6OkvJq/ryli0Zr93PbEenrmpHPVhHxmTRrM6X27diq2XaUV/H7FLp7fWEJaShe+eN5QvvHp0+jfPTMcu26CZImilXD/KunVqxdTpkxh7NixZGVl0a9fv5PPzZgxg/vvv59x48YxcuRIJk+eHLb3NSYQVWX9/nKefnc/L2wq4XhtA5/ol8uPPzeGz0/I9zkz2N93Y2BeFndcNILbLjydN3cd4unV+3jkrb089OYeCof24AsTB3PpuAFkpwd/uNl5sILfrXifFzcfIDM1ha99ajhf+9Qw+na1BOEFcSZIJ4bCwkJtfeGi7du3M3r0aI8iiq5k2tdEE4lZxb62d6SqliXri3l69X52flRBdnoKl40byBcmDWbC4LywzfA/VHmCxeuKeGr1fnaXVdE1I5XLxw/k+klDGJvf3W+MI/rl8rvXdvHy1oPkpKfwxU8W8LXzh9ErN6OddzQdJSJrVbUw4DqWKBJHMu1rIvE3Y/fuq87sULLwtb30lC6MHdiNLQeOUVvfyFmDujNr0hA+N24AXTMjV3FYVVm99whPvbuPFzcf4ER9I2cM7Mbo/l35x+YD1NSdGqXURZzJbF0zU/nKJwv46vnDyMtuv+aR6ZxgEoU1PRnjsV++7Luq6PwXtnZoaPZ/v7S9zfZqGxpZv7+cL32ygOsKBzNmYLdOxRwsEWHSsJ5MGtaTn1x+Bs9vKObJd/fzzLriNus2JYk377qQ7llWLj+WWKIwpgNCbSpqbFRKjlafvMbA7gDXG2hSfryO7z+zKaxxz7888BDxSOqelcbN5xVw0+ShDJ/3ks9JcpU19ZYkYpAlCmNC5K+chapy/og+7kVnKtlz6Lh7W8Xew8epbTYZLDs9hYJeOZyR353DlbUtKo426dctg2e/9cmQ47v6j2/x0bETbZZH4oI2HSEiDMzL8jlnKVZiNC1ZojAmRP4uQPOfiza2+JXcvMT01JF9KejlVhXtk0PfrhknO4799VHMmzmaQT1Cn8Q2b+bomC89EY05SyZ8LFEYE0B9QyO7D1Wxpfgom4uPsrX4mN8L0Cgw/7IxblXRliWmAwn3/J14KD0RDzGaUyKaKERkBnAPzpXqHlLVBa2enwPc2CyW0UAfVf1YRPYCFUADUN9er3zYbFoEr/0MjhZB90Ew7ccw7rqovDVAbm4ulZWVUXu/ZBFMn0JtfSPvl1awtfgYm4uPsqXkKNsPHDs5MiczrQtjBnQjJz2FKh/XKs7Py+LLUzp2Kdpwz9+Jh1nK8RCjcUTyUqgpwH3AxUARsFpEnlfVbU3rqOpCYKG7/mXAnaravLDMBap6KFIxtrFpEbxwO9S5badH9zuPIarJwoSXrz6FuYs3se/jKnrlZrCl+Bhbio+y82DFyVFGuRmpjBnYjRsmDWVsfjfOzO/O8D65pHSRuL4AjTEdEckziknALlXdDSAiTwFXANv8rH898GQE44F/zoWDm/0/X7QaGlp1AtZVw3O3wdpHfb+m/5kwc4Hv54C77rqLoUOHnrwexfz58xERVq1axZEjR6irq+PnP/85V1xxRah7Y4Lkq0R2TV0jv37lfcAZjTM2vxtfmVLA2PzujM3vztCe2SdLV7RmzSYm2UQyUeQD+5s9LgLO9bWiiGQDM4Dbmi1WYLmIKPCAqj7o57WzgdkAQ4YM6VzErZNEe8uDMGvWLL7zne+cTBSLFi3i5Zdf5s4776Rbt24cOnSIyZMnc/nll9t1ryNAVf2WyAb4v+9fwKAeWSH/21uziUkmkUwUvr55/qaBXwb8q1Wz0xRVLRGRvsArIrJDVVe12aCTQB4EZ2Z2wIgC/PIH4Ddjneam1roPhq+8GPi1fkyYMIHS0lJKSkooKyujR48eDBgwgDvvvJNVq1bRpUsXiouL+eijj+jfv3+H3sP4tuPgMeY/v9Xv8/l5WVEpjW1MvGt/SAYgIs+KyKUiEtT6riJgcLPHg4ASP+vOolWzk6qWuLelwBKcpqzImvZjSGs1jjsty1neCddccw3PPPMMTz/9NLNmzeLxxx+nrKyMtWvXsmHDBvr16+ezvLjpmKPH65j//FYuvfdNdhys4NrCQWSltfyva30KxgQv2DOKPwJfAe4Vkb8Dj6jqjnZesxoYISLDgGKcZHBD65VEpDvwGeCmZstygC6qWuHe/yzwsyBj7bimDuswj3qaNWsWX//61zl06BBvvPEGixYtom/fvqSlpbFy5Uo+/PDDMARvGhqVRWv2s3DZTsqP13LjuUP57mc/QV52OlNO6219CsZ0UFCJQlVfBV51D+rX4zQF7Qf+BPxNVet8vKZeRG4DluEMj31YVbeKyDfd5+93V/08sFxVq5q9vB+wxG03TgWeUNWXO7SHoRp3XdhHOJ1xxhlUVFSQn5/PgAEDuPHGG7nssssoLCxk/PjxjBrV8cs1GsfaD48w//mtbC4+yqSCnsy//IwW9YysT8GYjgu6eqyI9ML51X8zThPS48D5wJmqOjVSAYbCqscmz742Ka2oYcE/d7B4XTH9u2Uy75JRXH7WQBsYYEyQwlY9VkQWA6OAvwKXqeoB96mnRWSN/1caExm19Y088tYe7n1tF7X1jdwy9TRuveB0cjKs2IAx4Rbst+r3qrrC1xNRmzFtjGvVe2XMf2Eru8uqmDaqLz/6nFM2wxgTGcEmitEisk5VywFEpAdwvar+IXKhhY+qJnxTRCJdgMqffYeP818vbuOVbR9R0Cubv3x5IheM6ut1WMYkvGATxddV9b6mB6p6RES+DsR8osjMzOTw4cP06tUrYZOFqnL48GEyMxPjesKt6zLdMW0ERUeOc/+q3aR2Ee6aMYqvnl9ARmqK16EakxSCTRRdRETU/dnq1nGKi2sUDho0iKKiIsrKyrwOJaIyMzMZNGiQ12F0mq+6THc9uwkFrhg/kHkzR9O/e2IkRGPiRbCJYhmwSETux5ld/U0gOsNVOyktLY1hwzpW0dNEn6+6TAr0zk3nnlkTvAnKmCQXbKK4C/gG8C2c0hzLgYciFZRJXiV+6jIdrqyNciTGmCbBTrhrxJmd/cfIhmOS1cdVtdy3cpffYmB2iUxjvBPsPIoRwN3AGOBkA7GqDo9QXCZJHK+t5y//2sv9r39AVW09k4f1ZMP+cmqaXV/a6jIZ461gm57+AvwE+A1wAU7dp8QcQmSior6hkUVrivjtq+9RWnGCi8f04/vTRzKiX9egrkZnjImeoEp4uFO8zxGRzap6prvs/1T1UxGPMAS+SniY2KKqLNt6kF8u28nusirOGdqDeTNHUVjQ0+vQjElKYSvhAdS4Jcbfdwv9FQM208mE5N+7D3P3P3ewYX85p/fN5U9fLOSi0X0Tdn6LMYki2ETxHSAbuB34L5zmpy9FKiiTWHYcPMYvX97Jih2l9O+WyS+vHsdVZ+eTmhLK5U2MMV5pN1G4k+uuU9U5QCVO/4Qx7Sour+bXy99j8foicjNSuWvGKL78yQKy0m1GtTHxpN1EoaoNInJO85nZxjTXuvP5lqmnsfdwFY++7VyQ6eufGs4tU08jLzsuJvMbY1oJtulpPfCce3W7kxcYUtXFEYnKRFQ4RxX5Krnxw6VbALjmnEHcefEnyLc5EMbEtWATRU/gMHBhs2UKBEwUIjIDuAfnCncPqeqCVs9PBZ4D9riLFqvqz4J5rekYXwf2eYs3A/hMFnUNjRw/0UBlbT1VJ5r+GqhyH//0hW1tSm4A9O2awa+uPSuyO2OMiYpgZ2aH3C/h9m3cB1wMFAGrReR5Vd3WatX/U9XPdfC1JkS+ailV1zVw17ObeOztvS2SQFVtA7XNJr6FoqziRBiiNcbEgmBnZv8F2lZXUNWvBnjZJGCXqu52t/EUcAUQzMG+M681AfirpXSivpHs9FT6dM0gJz2VnIxUsjNSyE1PJTsjldyMFLLTU8nNSCU7PYWcDGed6x98h4PHatpsz0puGJM4gm16+kez+5nA53Gumx1IPrC/2eMi4Fwf650nIv4VgLcAABSKSURBVBvd7X1PVbeG8FpEZDYwG2DIkCHthGR65aZzyEeBvfy8LP72NZ//xAHNnTmqRVMWWMkNYxJNsE1PzzZ/LCJPAq+28zJfs6han5WsA4aqaqWIXAIsBUYE+dqm2B4EHgRnZnY7MSW10mM11NQ1ILT8x+zMgb2pX8NKbhiTuDp6JfoRQHs/34uAwc0eD6LVWYiqHmt2/yUR+YOI9A7mtSY09Q2N3P7Ueuoble/PGMnf3tkXtgP7lRPyLTEYk8CC7aOooOWP0IM416gIZDUwQkSG4ZT8mAXc0Gq7/YGPVFVFZBLQBWd0VXl7rzWhuee193ln98f86tqzuOacQXxr6uleh2SMiRPBNj11DXXDqlrv1oVahjPE9WFV3Soi33Sfvx+4BviWiNQD1cAsd1Kfz9eGGoNxvPFeGb9fuYtrzxnENefE/+VSjTHRFWz12M8DK1T1qPs4D5iqqksjHF9IrHpsWweOVnPpvW/SJzeDpbdOsfIZxpgWgqkeG2xVtp80JQkAVS3HuT6FiWF1DY3c/uR6auoauO/Gsy1JGGM6JNjObF8JpaMd4SZKfrV8J6v3HuGeWeM5vW+u1+EYY+JUsGcUa0Tk1yJymogMF5HfAGsjGZjpnNe2f8QDb+zmhnOHcMV4G5FkjOm4YBPFt4Fa4GlgEU7H862RCsp0TtGR4/znoo2MGdCNH39ujNfhGGPiXLCjnqqAuRGOxYRBbX0jtz2xnoZG5Q83nk1mmvVLGGM6J6gzChF5xR3p1PS4h4gsi1xYpqP+52XnUqP/c/U4CnrneB2OMSYBBNv01Nsd6QSAqh7Brpkdc17ecpA/v7mHL503lEvHDfA6HGNMggg2UTSKyMmSHSJSgJ/aS8Yb+w4fZ84zGxk3qDs/uHS01+EYYxJIsENcfwi8KSJvuI8/jVux1XjvRH0Dtz6xDgHuu+FsMlKtX8IYEz7Bdma/LCKFOMlhA85V6Xxf2MBE3S9e3M7m4qM8cPM5DO6Z7XU4xpgEE2xRwK8Bd+BUcd0ATAbepuWlUY0H/rGphMfe/pCvnT+M6Wf09zocY0wCCraP4g5gIvChql4ATADKIhaVCcqeQ1XMfXYzE4bkcdfMUV6HY4xJUMEmihpVrQEQkQxV3QHYJcw8VFPXwC2PryM1Rfj9DWeTlhLsR2mMMaEJtjO7yJ1HsRR4RUSOYBcS8tRPX9jG9gPHePjLheTb9amNMREUbGf2592780VkJdAdeDliUZmAlq4v5sl39/HNz5zGhaP6eR2OMSbBhVwBVlXfaH8tEym7Siv5wZLNTCroyfc++wmvwzHGJIGINmyLyAwR2Skiu0SkTa0oEblRRDa5f2+JyFnNntsrIptFZIOI2NWIgOraBm59fB1ZaSnce/0EUq1fwjubFsFvxsL8POd206LY2p4xYRSxa0qISApwH3AxUASsFpHnVXVbs9X2AJ9R1SMiMhN4EDi32fMXqOqhSMUYD5auL2bhsp2UlFeTlZ7C8doGHvvqJPp3z/Q6tOS1aRG8cDvUuVOJju53HgOMu8777RkTZpG8+NAkYJeq7gYQkaeAK4CTiUJV32q2/js48zSMa+n6YuYt3kx1XQMAx2sbSO0ifFxV63FkcWjTInjtZ3C0CLoPgmk/Dv0g3NgINeWw/EenDupN6qrhpe9B+YfQUAf1J5zbhloff62eL1kPjXVtt/fazyxRmJgQyUSRD+xv9riIlmcLrf0H8M9mjxVYLiIKPKCqD/p6kYjMxi0nMmTIEF+rxK2Fy3aeTBJN6huVhct2cuUEuxhR0AL9Yj/j81BVBpWlUHUIqkqbPS5z77u3xw9BY73/96k5Cit+7txPSXf/0iAlo9n9dEhNP/V8enbbJNHk6H7Y9jx8YjqkZoTv38MkjnD8AApCJBOF+Fjms5CgiFyAkyjOb7Z4iqqWiEhfnCG5O1R1VZsNOgnkQYDCwsKEKVTY0KgUl/uuklLiZ7nx49Wf+j4DWDwbFn/d92tSMyGnL+T2ge75MHA85PSB3L7wxkKoPtz2Nd3y4fYNTkIQX//9/fjNWCcptCZdYNHNkNndSWjjZsGQyaFtO5yidFDqsEjEF+5thnN7UWyyjGSiKAIGN3s8CB9zL0RkHPAQMFNVT377VLXEvS0VkSU4TVltEkVnNe8DGJiXxZzpIz39tV7f0MhzG0q4b+Uuv+sMtHkT7assg/eXwc5/wrEiPyspTP2Bkwxy+jiJIae3kwzSc/0fkLN7tfyCAqRlwUXznbOFUE37se/tXfpbyO0NG592DgprH4G8oTDuC3DWLOh1Wujv1VGROCjF+kEzWn1RjfUw8hKoO+485/e21bLVf/b9AygCTZaiGpkf4SKSCrwHTAOKgdXADaq6tdk6Q4AVwBeb91eISA7QRVUr3PuvAD9T1YBzNwoLC3XNmuAHSLXuAwDISkvh7qvOjHqyqK1vZMn6Iu5b+QH7Pj7OqP5dmTy8J0+v3k91XaPn8QUUC780VaFsJ+x8yUkORasBhW6DnH6F2sq2r+k+GO7c0rH3i/YvzRMVsP0fsOkp2P0GoJBf6CSMM66CnF4df+9g/OYMJ7bWcvvBF59r1tTmNrGlus1tXVJ9J9zWB01wkuNl98LYq53P60Ql1FZBbYVze6LSWd7iOffxpkXOwbO1LmnQewQ0NoA2grq3jY2tHje0fa6uyv+/R2qWc8YnAoh7H/e++7j1/apSZ7vhkJoJ9TV+nhSYX+7nOR9ri6xV1cKA60QqUbgBXAL8FkgBHlbVX4jINwFU9X4ReQi4GvjQfUm9qhaKyHBgibssFXhCVX/R3vuFmiimLFjhs3knPy+Lf82NTr3DE/UN/H1NEX98/QOKy6sZm9+N2y8cwUWj+9Gli8TcGU8bgb7wkU4WDXWw7x0nMex8CY7scZYPGO/8Qhs5E/qfCZv/7l2MkXCsxNmnjU9D6VbnYDzis86ZxidmQFpmxxJZXTUc2Qsf73H+LT/e3fJ+R6Wku/00zfpojpX46e8RQrrUTVoOpOc4B2F/Rl/mHshTnNsuKc0eS6vHzZ5/+/f+t/nJbzs/TlSdeFXdJNB8WWPL++se87+96Xc7/yfTslvduvfTs08tS810YvTXZBniDyDPE0W0hZoohs190e9/yd/fMIFPjehD96y08ATXSk1dA0+9u4/739jNwWM1jB+cxx3TRjB1ZB8k0m3Qnfk1XF8L1R/D8Y+d20VfhOM+2uu7DoDb1zv/scMZX81R2PWqkxzeX+48TsmA4Z9xDpKfmOH0KYRzn2PZwS3OWcamv0PlQcjo7iTHotXQcOLUek2J8fSL3AP/nlO3TfcrDrTcdkZ36FkAPYbBB685ZzWtZfeGS3/l/L8IZoRX09/GJ/3v09QfOAf/jFynCTA9172fA+ldTz2XlgNd3LlEYTpothDubYZ7e2H6kWaJoh3+zihEnB8CKV2EwqE9mDa6LxeO6stpfXI7fRA/XlvPE//exwOrdlNWcYKJBT24fdoIzj+9d+QTBPj+z5WSAed+A/qNbZkEWtyWO/d9NeEEkpkH3QZC1/7Qtem2f7NlA5y+gZRU//GlZsKYK50D4d43nV+i2b2cpDByJgy/wDlwJLPGBtjzhtuf8TS+f5X7+LWe2x96DnOSwcnb4c79rB6nmo3CfeYYowfNiG4zUjF28geQJYp2+Ouj+MWVYxnSK5sVO0pZsaOUHQedX1KDe2YxbVQ/LhjVl3OH9SQzLfgryVWeqOdv73zIn1bt5nBVLecN78Xt00YweXjP6CQIcLLfrz4R+DQdAIGsPMjqCdk9ndusHqfuZ/c4tWzJN6Dyo7abyOoJ590CFQedv2Mlzm3lR05bcIu36+Iki679oWyH/7bX3iOdxDByJgya6Jx+m7bm5+G3+eazPz+VDHoUOE0awYpk5zPExEEz4tuMwTNbSxRBWP38Awxet5C+Wkap9GH/2XOYePk3WqxTXF7Nyh2lrNxRypu7DnGivpGstBTOH9GbC0f15YKRfU/OlG7dp3DbhadxuLKWh97cQ/nxOj41oje3TxvBxIKeYdvvdlUdgo1Pwfq/OgdinwS+vdY5+Gd2D/4gHOoXvrHBmZNQcQCOHXBuKw5ChZtIdr3qP74QOuiSWiSaYSIhBg+aycgSRXs68Kumpq6Btz84zGs7PmLljrKTTVdjBnRjUI9M3njPSSStXTiqL9++8HQmDOkR0j51WGMDfLAS1j8GO15yJnUNmgiHd0H1kbbrx8oIoHg5yMUyLwcYmLhjiaI9nTwoqSrvfVTpJo1SVu/1cQAG+nTNYPUPLwo+rs44shfWPw4bnnDmD2T3grOuhwk3Qd/RsX8QifX44oX9WjdBCiZRRHLCXezzNS4cnOTx3nJnFmxmN78vFxFG9u/KyP5duWXq6X5HUR2qOOFjaRjV1cCOfzhNS7tfBwROnwbTf+EME20+CazpYBGrB5FYjy9ejLvO/s1M2CR3oug+yPcZBcAT1zqdrP3HQcH5MPSTMOQ8p0PXj4F5WT5HUUVsJvXBzbDur84ol5pyyBsCF/wQxt/g7Js/sX4QifX4jEkyyZ0o/JVOmPkryBsMH/4L9v4L3v2TO/lGoN8ZMHSKkziGTnHKP7jmTB/Jm0v+wHd4ioFyiBLtzW+ZxfnTb+l4jK2bED79Paf/Yf1fnaqjKenOhKIJN8Owz5waV26MMWGS3H0UEFxbbv0JKF7rJI0P34T9754qF9B7JBRMcZLG8Y+pX/4jUhtODe+sT8kk9Yrfdayk9YbH4aU5UO+jCGC/M+Hsm+HMawOe5RhjTCDWmR0pDXVQssFJGnv/5ZSRqPUxa7VJei6ceY3Tl1Bf7SSeumpnvkCd+7i+2n3e/WsIcM2J3H7w3Z3eVRE1xiQM68yOlJQ0GDzR+Tv/Tmioh482w4NTfa9fW+kMUU3LdGYZp2aeqtmS1aPZskyn2FjT7ev/7Xt7laWWJIwxUWOJIhxSUmHgBGdYbTjnAKz/q5/t2YUAjTHRYz2f4TTtx22L4KVlOctjYXvGGNMBlijCadx1zsSw7oMBcW47M1Es3NszxpgOsM5sY4xJYkk36klEyjh1EaRQ9QYOhTGccIv1+MBiDIdYjw9iP8ZYjw9iK8ahqton0AoJlSg6Q0TWtJdVvRTr8YHFGA6xHh/EfoyxHh/ER4zNWR+FMcaYgCxRGGOMCcgSxSkPeh1AO2I9PrAYwyHW44PYjzHW44P4iPEk66MwxhgTkJ1RGGOMCcgShTHGmICSPlGIyAwR2Skiu0RkrtfxtCYig0VkpYhsF5GtInKH1zH5IiIpIrJeRP7hdSy+iEieiDwjIjvcf8vzvI6pNRG50/2Mt4jIkyKS6XE8D4tIqYhsabasp4i8IiLvu7dRugh8SDEudD/nTSKyRETyYi3GZs99T0RURHp7EVuwkjpRiEgKcB8wExgDXC8iY7yNqo164LuqOhqYDNwagzEC3AFs9zqIAO4BXlbVUcBZxFisIpIP3A4UqupYIAWY5W1UPALMaLVsLvCaqo4AXnMfe+kR2sb4CjBWVccB7wHzoh1UK4/QNkZEZDBwMbAv2gGFKqkTBTAJ2KWqu1W1FngKuMLjmFpQ1QOqus69X4FzgMv3NqqWRGQQcCnwkNex+CIi3YBPA38GUNVaVS33NiqfUoEsEUkFsoESL4NR1VXAx60WXwE86t5/FLgyqkG14itGVV2uqvXuw3cAT8st+/l3BPgN8H0g5kcUJXuiyAea1/EuIsYOws2JSAEwAfi3t5G08Vuc//CNXgfix3CgDPiL2zz2kIjkeB1Uc6paDPwK59flAeCoqi73Niqf+qnqAXB+xAB9PY6nPV8F/ul1EK2JyOVAsapu9DqWYCR7ovB19Z+YzO4ikgs8C3xHVY95HU8TEfkcUKqqa72OJYBU4Gzgj6o6AajC+yaTFty2/iuAYcBAIEdEbvI2qvgmIj/Eabp93OtYmhORbOCHQNxcLyDZE0URMLjZ40F4fLrvi4ik4SSJx1V1sdfxtDIFuFxE9uI03V0oIn/zNqQ2ioAiVW06E3sGJ3HEkouAPapapqp1wGLgkx7H5MtHIjIAwL0t9Tgen0TkS8DngBs19iaLnYbzg2Cj+70ZBKwTkf6eRhVAsieK1cAIERkmIuk4nYfPexxTCyIiOG3r21X1117H05qqzlPVQapagPPvt0JVY+qXsKoeBPaLyEh30TRgm4ch+bIPmCwi2e5nPo0Y63B3PQ98yb3/JeA5D2PxSURmAHcBl6vqca/jaU1VN6tqX1UtcL83RcDZ7v/TmJTUicLt8LoNWIbzpVykqlu9jaqNKcDNOL/UN7h/l3gdVBz6NvC4iGwCxgN+LkjuDfds5xlgHbAZ57vpaZkHEXkSeBsYKSJFIvIfwALgYhF5H2fEzoIYjPH3QFfgFff7cn8MxhhXrISHMcaYgJL6jMIYY0z7LFEYY4wJyBKFMcaYgCxRGGOMCcgShTHGmIAsURgTA0RkaqxW3jXGEoUxxpiALFEYEwIRuUlE3nUncj3gXoejUkT+V0TWichrItLHXXe8iLzT7LoIPdzlp4vIqyKy0X3Nae7mc5tdM+Nxd4a2MZ6zRGFMkERkNPAFYIqqjgcagBuBHGCdqp4NvAH8xH3JY8Bd7nURNjdb/jhwn6qehVPP6YC7fALwHZxrowzHmZVvjOdSvQ7AmDgyDTgHWO3+2M/CKYrXCDztrvM3YLGIdAfyVPUNd/mjwN9FpCuQr6pLAFS1BsDd3ruqWuQ+3gAUAG9GfreMCcwShTHBE+BRVW1xxTQR+VGr9QLVxQnUnHSi2f0G7PtpYoQ1PRkTvNeAa0SkL5y8fvRQnO/RNe46NwBvqupR4IiIfMpdfjPwhnstkSIRudLdRoZ7fQJjYpb9YjEmSKq6TUT+H7BcRLoAdcCtOBdCOkNE1gJHcfoxwCnDfb+bCHYDX3GX3ww8ICI/c7dxbRR3w5iQWfVYYzpJRCpVNdfrOIyJFGt6MsYYE5CdURhjjAnIziiMMcYEZInCGGNMQJYojDHGBGSJwhhjTECWKIwxxgT0/wEa9nGgFsCvsgAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.subplot(2, 1, 1)\n",
    "plt.plot(solver.loss_history, 'o')\n",
    "plt.xlabel('iteration')\n",
    "plt.ylabel('loss')\n",
    "\n",
    "plt.subplot(2, 1, 2)\n",
    "plt.plot(solver.train_acc_history, '-o')\n",
    "plt.plot(solver.val_acc_history, '-o')\n",
    "plt.legend(['train', 'val'], loc='upper left')\n",
    "plt.xlabel('epoch')\n",
    "plt.ylabel('accuracy')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Train the net\n",
    "By training the three-layer convolutional network for one epoch, you should achieve greater than 40% accuracy on the training set:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(Iteration 1 / 980) loss: 2.306791\n",
      "(Epoch 0 / 1) train acc: 0.103000; val_acc: 0.107000\n",
      "(Iteration 21 / 980) loss: 2.126007\n",
      "(Iteration 41 / 980) loss: 1.978828\n",
      "(Iteration 61 / 980) loss: 1.879498\n",
      "(Iteration 81 / 980) loss: 1.795154\n",
      "(Iteration 101 / 980) loss: 1.748704\n",
      "(Iteration 121 / 980) loss: 1.619527\n",
      "(Iteration 141 / 980) loss: 1.888192\n",
      "(Iteration 161 / 980) loss: 2.055906\n",
      "(Iteration 181 / 980) loss: 1.821506\n",
      "(Iteration 201 / 980) loss: 2.068563\n",
      "(Iteration 221 / 980) loss: 1.894769\n",
      "(Iteration 241 / 980) loss: 1.685644\n",
      "(Iteration 261 / 980) loss: 1.617659\n",
      "(Iteration 281 / 980) loss: 1.825867\n",
      "(Iteration 301 / 980) loss: 1.846340\n",
      "(Iteration 321 / 980) loss: 1.796345\n",
      "(Iteration 341 / 980) loss: 1.725324\n",
      "(Iteration 361 / 980) loss: 1.878257\n",
      "(Iteration 381 / 980) loss: 1.612843\n",
      "(Iteration 401 / 980) loss: 1.670913\n",
      "(Iteration 421 / 980) loss: 1.512967\n",
      "(Iteration 441 / 980) loss: 1.756186\n",
      "(Iteration 461 / 980) loss: 1.820591\n",
      "(Iteration 481 / 980) loss: 1.487956\n",
      "(Iteration 501 / 980) loss: 1.421648\n",
      "(Iteration 521 / 980) loss: 1.911582\n",
      "(Iteration 541 / 980) loss: 1.551149\n",
      "(Iteration 561 / 980) loss: 1.739551\n",
      "(Iteration 581 / 980) loss: 1.494856\n",
      "(Iteration 601 / 980) loss: 1.625713\n",
      "(Iteration 621 / 980) loss: 1.588532\n",
      "(Iteration 641 / 980) loss: 1.730055\n",
      "(Iteration 661 / 980) loss: 1.622283\n",
      "(Iteration 681 / 980) loss: 1.780818\n",
      "(Iteration 701 / 980) loss: 1.377566\n",
      "(Iteration 721 / 980) loss: 1.563941\n",
      "(Iteration 741 / 980) loss: 1.735714\n",
      "(Iteration 761 / 980) loss: 1.498669\n",
      "(Iteration 781 / 980) loss: 2.289787\n",
      "(Iteration 801 / 980) loss: 1.762956\n",
      "(Iteration 821 / 980) loss: 1.618472\n",
      "(Iteration 841 / 980) loss: 1.478389\n",
      "(Iteration 861 / 980) loss: 1.709902\n",
      "(Iteration 881 / 980) loss: 1.616805\n",
      "(Iteration 901 / 980) loss: 1.585561\n",
      "(Iteration 921 / 980) loss: 1.755791\n",
      "(Iteration 941 / 980) loss: 1.706363\n",
      "(Iteration 961 / 980) loss: 1.568267\n",
      "(Epoch 1 / 1) train acc: 0.492000; val_acc: 0.469000\n"
     ]
    }
   ],
   "source": [
    "model = ThreeLayerConvNet(weight_scale=0.001, hidden_dim=500, reg=0.001)\n",
    "\n",
    "solver = Solver(model, data,\n",
    "                num_epochs=1, batch_size=50,\n",
    "                update_rule='adam',\n",
    "                optim_config={\n",
    "                  'learning_rate': 1e-3,\n",
    "                },\n",
    "                verbose=True, print_every=20)\n",
    "solver.train()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Visualize Filters\n",
    "You can visualize the first-layer convolutional filters from the trained network by running the following:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 360x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "from cs231n.vis_utils import visualize_grid\n",
    "\n",
    "grid = visualize_grid(model.params['W1'].transpose(0, 2, 3, 1))\n",
    "plt.imshow(grid.astype('uint8'))\n",
    "plt.axis('off')\n",
    "plt.gcf().set_size_inches(5, 5)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Spatial Batch Normalization\n",
    "We already saw that batch normalization is a very useful technique for training deep fully-connected networks. As proposed in the original paper (link in `BatchNormalization.ipynb`), batch normalization can also be used for convolutional networks, but we need to tweak it a bit; the modification will be called \"spatial batch normalization.\"\n",
    "\n",
    "Normally batch-normalization accepts inputs of shape `(N, D)` and produces outputs of shape `(N, D)`, where we normalize across the minibatch dimension `N`. For data coming from convolutional layers, batch normalization needs to accept inputs of shape `(N, C, H, W)` and produce outputs of shape `(N, C, H, W)` where the `N` dimension gives the minibatch size and the `(H, W)` dimensions give the spatial size of the feature map.\n",
    "\n",
    "If the feature map was produced using convolutions, then we expect every feature channel's statistics e.g. mean, variance to be relatively consistent both between different images, and different locations within the same image -- after all, every feature channel is produced by the same convolutional filter! Therefore spatial batch normalization computes a mean and variance for each of the `C` feature channels by computing statistics over the minibatch dimension `N` as well the spatial dimensions `H` and `W`.\n",
    "\n",
    "\n",
    "[1] [Sergey Ioffe and Christian Szegedy, \"Batch Normalization: Accelerating Deep Network Training by Reducing\n",
    "Internal Covariate Shift\", ICML 2015.](https://arxiv.org/abs/1502.03167)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Spatial batch normalization: forward\n",
    "\n",
    "In the file `cs231n/layers.py`, implement the forward pass for spatial batch normalization in the function `spatial_batchnorm_forward`. Check your implementation by running the following:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Before spatial batch normalization:\n",
      "  Shape:  (2, 3, 4, 5)\n",
      "  Means:  [9.33463814 8.90909116 9.11056338]\n",
      "  Stds:  [3.61447857 3.19347686 3.5168142 ]\n",
      "After spatial batch normalization:\n",
      "  Shape:  (2, 3, 4, 5)\n",
      "  Means:  [ 6.18949336e-16  5.99520433e-16 -1.22124533e-16]\n",
      "  Stds:  [0.99999962 0.99999951 0.9999996 ]\n",
      "After spatial batch normalization (nontrivial gamma, beta):\n",
      "  Shape:  (2, 3, 4, 5)\n",
      "  Means:  [6. 7. 8.]\n",
      "  Stds:  [2.99999885 3.99999804 4.99999798]\n"
     ]
    }
   ],
   "source": [
    "np.random.seed(231)\n",
    "# Check the training-time forward pass by checking means and variances\n",
    "# of features both before and after spatial batch normalization\n",
    "\n",
    "N, C, H, W = 2, 3, 4, 5\n",
    "x = 4 * np.random.randn(N, C, H, W) + 10\n",
    "\n",
    "print('Before spatial batch normalization:')\n",
    "print('  Shape: ', x.shape)\n",
    "print('  Means: ', x.mean(axis=(0, 2, 3)))\n",
    "print('  Stds: ', x.std(axis=(0, 2, 3)))\n",
    "\n",
    "# Means should be close to zero and stds close to one\n",
    "gamma, beta = np.ones(C), np.zeros(C)\n",
    "bn_param = {'mode': 'train'}\n",
    "out, _ = spatial_batchnorm_forward(x, gamma, beta, bn_param)\n",
    "print('After spatial batch normalization:')\n",
    "print('  Shape: ', out.shape)\n",
    "print('  Means: ', out.mean(axis=(0, 2, 3)))\n",
    "print('  Stds: ', out.std(axis=(0, 2, 3)))\n",
    "\n",
    "# Means should be close to beta and stds close to gamma\n",
    "gamma, beta = np.asarray([3, 4, 5]), np.asarray([6, 7, 8])\n",
    "out, _ = spatial_batchnorm_forward(x, gamma, beta, bn_param)\n",
    "print('After spatial batch normalization (nontrivial gamma, beta):')\n",
    "print('  Shape: ', out.shape)\n",
    "print('  Means: ', out.mean(axis=(0, 2, 3)))\n",
    "print('  Stds: ', out.std(axis=(0, 2, 3)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "After spatial batch normalization (test-time):\n",
      "  means:  [-0.08034406  0.07562881  0.05716371  0.04378383]\n",
      "  stds:  [0.96718744 1.0299714  1.02887624 1.00585577]\n"
     ]
    }
   ],
   "source": [
    "np.random.seed(231)\n",
    "# Check the test-time forward pass by running the training-time\n",
    "# forward pass many times to warm up the running averages, and then\n",
    "# checking the means and variances of activations after a test-time\n",
    "# forward pass.\n",
    "N, C, H, W = 10, 4, 11, 12\n",
    "\n",
    "bn_param = {'mode': 'train'}\n",
    "gamma = np.ones(C)\n",
    "beta = np.zeros(C)\n",
    "for t in range(50):\n",
    "  x = 2.3 * np.random.randn(N, C, H, W) + 13\n",
    "  spatial_batchnorm_forward(x, gamma, beta, bn_param)\n",
    "bn_param['mode'] = 'test'\n",
    "x = 2.3 * np.random.randn(N, C, H, W) + 13\n",
    "a_norm, _ = spatial_batchnorm_forward(x, gamma, beta, bn_param)\n",
    "\n",
    "# Means should be close to zero and stds close to one, but will be\n",
    "# noisier than training-time forward passes.\n",
    "print('After spatial batch normalization (test-time):')\n",
    "print('  means: ', a_norm.mean(axis=(0, 2, 3)))\n",
    "print('  stds: ', a_norm.std(axis=(0, 2, 3)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Spatial batch normalization: backward\n",
    "In the file `cs231n/layers.py`, implement the backward pass for spatial batch normalization in the function `spatial_batchnorm_backward`. Run the following to check your implementation using a numeric gradient check:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "dx error:  2.78664819678539e-07\n",
      "dgamma error:  7.0974817113608705e-12\n",
      "dbeta error:  3.275608725278405e-12\n"
     ]
    }
   ],
   "source": [
    "np.random.seed(231)\n",
    "N, C, H, W = 2, 3, 4, 5\n",
    "x = 5 * np.random.randn(N, C, H, W) + 12\n",
    "gamma = np.random.randn(C)\n",
    "beta = np.random.randn(C)\n",
    "dout = np.random.randn(N, C, H, W)\n",
    "\n",
    "bn_param = {'mode': 'train'}\n",
    "fx = lambda x: spatial_batchnorm_forward(x, gamma, beta, bn_param)[0]\n",
    "fg = lambda a: spatial_batchnorm_forward(x, gamma, beta, bn_param)[0]\n",
    "fb = lambda b: spatial_batchnorm_forward(x, gamma, beta, bn_param)[0]\n",
    "\n",
    "dx_num = eval_numerical_gradient_array(fx, x, dout)\n",
    "da_num = eval_numerical_gradient_array(fg, gamma, dout)\n",
    "db_num = eval_numerical_gradient_array(fb, beta, dout)\n",
    "\n",
    "#You should expect errors of magnitudes between 1e-12~1e-06\n",
    "_, cache = spatial_batchnorm_forward(x, gamma, beta, bn_param)\n",
    "dx, dgamma, dbeta = spatial_batchnorm_backward(dout, cache)\n",
    "print('dx error: ', rel_error(dx_num, dx))\n",
    "print('dgamma error: ', rel_error(da_num, dgamma))\n",
    "print('dbeta error: ', rel_error(db_num, dbeta))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Group Normalization\n",
    "In the previous notebook, we mentioned that Layer Normalization is an alternative normalization technique that mitigates the batch size limitations of Batch Normalization. However, as the authors of [2] observed, Layer Normalization does not perform as well as Batch Normalization when used with Convolutional Layers:\n",
    "\n",
    ">With fully connected layers, all the hidden units in a layer tend to make similar contributions to the final prediction, and re-centering and rescaling the summed inputs to a layer works well. However, the assumption of similar contributions is no longer true for convolutional neural networks. The large number of the hidden units whose\n",
    "receptive fields lie near the boundary of the image are rarely turned on and thus have very different\n",
    "statistics from the rest of the hidden units within the same layer.\n",
    "\n",
    "The authors of [3] propose an intermediary technique. In contrast to Layer Normalization, where you normalize over the entire feature per-datapoint, they suggest a consistent splitting of each per-datapoint feature into G groups, and a per-group per-datapoint normalization instead. \n",
    "\n",
    "![Comparison of normalization techniques discussed so far](notebook_images/normalization.png)\n",
    "<center>**Visual comparison of the normalization techniques discussed so far (image edited from [3])**</center>\n",
    "\n",
    "Even though an assumption of equal contribution is still being made within each group, the authors hypothesize that this is not as problematic, as innate grouping arises within features for visual recognition. One example they use to illustrate this is that many high-performance handcrafted features in traditional Computer Vision have terms that are explicitly grouped together. Take for example Histogram of Oriented Gradients [4]-- after computing histograms per spatially local block, each per-block histogram is normalized before being concatenated together to form the final feature vector.\n",
    "\n",
    "You will now implement Group Normalization. Note that this normalization technique that you are to implement in the following cells was introduced and published to ECCV just in 2018 -- this truly is still an ongoing and excitingly active field of research!\n",
    "\n",
    "[2] [Ba, Jimmy Lei, Jamie Ryan Kiros, and Geoffrey E. Hinton. \"Layer Normalization.\" stat 1050 (2016): 21.](https://arxiv.org/pdf/1607.06450.pdf)\n",
    "\n",
    "\n",
    "[3] [Wu, Yuxin, and Kaiming He. \"Group Normalization.\" arXiv preprint arXiv:1803.08494 (2018).](https://arxiv.org/abs/1803.08494)\n",
    "\n",
    "\n",
    "[4] [N. Dalal and B. Triggs. Histograms of oriented gradients for\n",
    "human detection. In Computer Vision and Pattern Recognition\n",
    "(CVPR), 2005.](https://ieeexplore.ieee.org/abstract/document/1467360/)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Group normalization: forward\n",
    "\n",
    "In the file `cs231n/layers.py`, implement the forward pass for group normalization in the function `spatial_groupnorm_forward`. Check your implementation by running the following:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 85,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Before spatial group normalization:\n",
      "  Shape:  (2, 6, 4, 5)\n",
      "  Means:  [9.72505327 8.51114185 8.9147544  9.43448077]\n",
      "  Stds:  [3.67070958 3.09892597 4.27043622 3.97521327]\n",
      "After spatial group normalization:\n",
      "  Shape:  (2, 6, 4, 5)\n",
      "  Means:  [-2.14643118e-16  5.25505565e-16  2.65528340e-16 -3.38618023e-16]\n",
      "  Stds:  [0.99999963 0.99999948 0.99999973 0.99999968]\n"
     ]
    }
   ],
   "source": [
    "np.random.seed(231)\n",
    "# Check the training-time forward pass by checking means and variances\n",
    "# of features both before and after spatial batch normalization\n",
    "\n",
    "N, C, H, W = 2, 6, 4, 5\n",
    "G = 2\n",
    "x = 4 * np.random.randn(N, C, H, W) + 10\n",
    "x_g = x.reshape((N*G,-1))\n",
    "print('Before spatial group normalization:')\n",
    "print('  Shape: ', x.shape)\n",
    "print('  Means: ', x_g.mean(axis=1))\n",
    "print('  Stds: ', x_g.std(axis=1))\n",
    "\n",
    "# Means should be close to zero and stds close to one\n",
    "gamma, beta = np.ones((1,C,1,1)), np.zeros((1,C,1,1))\n",
    "bn_param = {'mode': 'train'}\n",
    "\n",
    "out, _ = spatial_groupnorm_forward(x, gamma, beta, G, bn_param)\n",
    "out_g = out.reshape((N*G,-1))\n",
    "print('After spatial group normalization:')\n",
    "print('  Shape: ', out.shape)\n",
    "print('  Means: ', out_g.mean(axis=1))\n",
    "print('  Stds: ', out_g.std(axis=1))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Spatial group normalization: backward\n",
    "In the file `cs231n/layers.py`, implement the backward pass for spatial batch normalization in the function `spatial_groupnorm_backward`. Run the following to check your implementation using a numeric gradient check:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 87,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "dx error:  7.413109542981906e-08\n",
      "dgamma error:  9.468195772749234e-12\n",
      "dbeta error:  3.354494437653335e-12\n"
     ]
    }
   ],
   "source": [
    "np.random.seed(231)\n",
    "N, C, H, W = 2, 6, 4, 5\n",
    "G = 2\n",
    "x = 5 * np.random.randn(N, C, H, W) + 12\n",
    "gamma = np.random.randn(1,C,1,1)\n",
    "beta = np.random.randn(1,C,1,1)\n",
    "dout = np.random.randn(N, C, H, W)\n",
    "\n",
    "gn_param = {}\n",
    "fx = lambda x: spatial_groupnorm_forward(x, gamma, beta, G, gn_param)[0]\n",
    "fg = lambda a: spatial_groupnorm_forward(x, gamma, beta, G, gn_param)[0]\n",
    "fb = lambda b: spatial_groupnorm_forward(x, gamma, beta, G, gn_param)[0]\n",
    "\n",
    "dx_num = eval_numerical_gradient_array(fx, x, dout)\n",
    "da_num = eval_numerical_gradient_array(fg, gamma, dout)\n",
    "db_num = eval_numerical_gradient_array(fb, beta, dout)\n",
    "\n",
    "_, cache = spatial_groupnorm_forward(x, gamma, beta, G, gn_param)\n",
    "dx, dgamma, dbeta = spatial_groupnorm_backward(dout, cache)\n",
    "#You should expect errors of magnitudes between 1e-12~1e-07\n",
    "print('dx error: ', rel_error(dx_num, dx))\n",
    "print('dgamma error: ', rel_error(da_num, dgamma))\n",
    "print('dbeta error: ', rel_error(db_num, dbeta))"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
